package ar.edu.unq.tpi.uis.tepe3.wicket;

import org.apache.wicket.Page;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;

import ar.edu.unq.tpi.uis.tepe3.wicket.pages.DashboardPage;
import ar.edu.unq.tpi.uis.tepe3.wicket.panels.DefaultCreateNewMenuPanel;


public abstract class AbstractFormPage extends AbstractPage{

	protected Class<?> aResponsePage;
	protected Form aForm;
	protected Boolean isNew = false;
	
	/**
	 * En el caso de que no sea resetteado el valor aResponsePage se redirige a 
	 * el DashboardPage.class
	 */
	public AbstractFormPage(String tituloPagina) {
		add(new Label("tituloPagina", tituloPagina));
		setResponsePage(DashboardPage.class);
		this.isNew = true;
	}
	
	/**
	 * En el caso de que no sea resetteado el valor aResponsePage se redirige a 
	 * el DashboardPage.class
	 */
	public AbstractFormPage(String tituloPagina, IModel aModel) {
		setModel( new CompoundPropertyModel(aModel.getObject()) );
		add(new Label("tituloPagina", tituloPagina));
		this.aResponsePage = DashboardPage.class;
	}
	
	/**
	 * Initializa el formulario seteando un pagina de redireccion.
	 * @param aResponsePage
	 */
	protected void initializeForm(Class<?> aResponsePage){
		this.aResponsePage = aResponsePage;
		initializeForm();
	}
	
	private void initializeForm() {
		aForm = new Form("DefaultPageForm", getModel());
		System.out.println(getModel().getObject() + "desde el initialize");
		add(aForm);
		this.addFields();
		this.addActionButtons();
	}
	
	/**
	 * La definicion de los campos de un formulario, es particular de cada pagina.
	 */
	protected abstract void addFields();

	protected void addActionButtons() {
		addEditButton();
		addCancelButton();
	}
	
	protected void addEditButton(){
		aForm.add(new Button("save") {
			
			@Override
			public void onSubmit() {
				saveAction();
				//setResponsePage(aResponsePage);
			}
		});
	}
	
	protected void addCancelButton(){
		aForm.add(new Link("cancel") {
			@Override
			public void onClick() {
				setResponsePage(aResponsePage);
			}
		});
	}
	
	/**
	 * La definicion del compertamiento de guardar el modelo es particular de cada pagina.
	 */
	protected abstract void saveAction(); 
	
	protected void saveSucceed(){
		Page aPage = getDefaultResponsePage();
		aPage.info("El registro fue guardado con exito");
		this.setResponsePage(aPage);
	}
	
	private Page getDefaultResponsePage() {
		try {
			return (Page) aResponsePage.newInstance();
		} catch (Exception e) {
			error(e.getMessage());
		}
		return null;
	}

	@Override
	protected void addLeftMenu() {
		DefaultCreateNewMenuPanel aMenu = new DefaultCreateNewMenuPanel("leftMenu", getModel());
		add(aMenu);
	}
	
}
